﻿using Microsoft.Extensions.Options;
using System.ComponentModel.DataAnnotations;

namespace OptionsDemo.Services
{
    /// <summary>
    /// 在定义服务的时候，一般先定义接口，这里定义了一个IOrderService，他有一个方法，显示他的最大订单数
    /// </summary>
    public interface IOrderService
    {
        int ShowMaxOrderCount();
    }

    /// <summary>
    /// 定义一个OrderService，他的入参是一个OrderServiceOptions类型的Options
    /// </summary>
    public class OrderService : IOrderService
    {
        //IOptions<OrderServiceOptions> _options;
        //IOptionsSnapshot<OrderServiceOptions> _options;
        IOptionsMonitor<OrderServiceOptions> _options;

        public OrderService(IOptionsMonitor<OrderServiceOptions> options)
        {
            _options = options;

            _options.OnChange(options =>
            {
                System.Console.WriteLine($"配置发生了变化：{options.MaxOrderCount}");
            });
        }
        public int ShowMaxOrderCount()
        {
            //return _options.Value.MaxOrderCount;
            return _options.CurrentValue.MaxOrderCount;//Monitor与Snapshot的定义有些不同，他获取值需要使用CurrentValue
        }
    }

    /// <summary>
    /// 这个Options就代表我们需要从配置里面读取的值
    /// </summary>
    public class OrderServiceOptions
    {
        [Range(1,20)]
        public int MaxOrderCount { get; set; } = 100;
    }

    /// <summary>
    /// 实现IValidateOptions接口验证方式
    /// </summary>
    public class OrderServiceValidateOptions : IValidateOptions<OrderServiceOptions>
    {
        public ValidateOptionsResult Validate(string name, OrderServiceOptions options)
        {
            if (options.MaxOrderCount>100)
            {
                return ValidateOptionsResult.Fail(" 不能大于100");
            }
            return ValidateOptionsResult.Success;
        }
    }

}
